package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;


import com.divemotor.ventarepuestosinternet.beans.adapter.RepuestoAdapter;
import com.divemotor.ventarepuestosinternet.beans.form.RepuestoForm;
import com.divemotor.ventarepuestosinternet.beans.lazy.RepuestosLazy;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Repuesto;
import com.divemotor.ventarepuestosinternet.model.UnidadMedida;
import com.divemotor.ventarepuestosinternet.service.RepuestoService;
import com.divemotor.ventarepuestosinternet.service.UnidadMedidaService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.FacesContextUtil;

@ManagedBean(name="gestionRepuestosController")
@ViewScoped
public class GestionRepuestosController implements Serializable {

	private static final Logger logger = Logger.getLogger(GestionRepuestosController.class);
	
	private static final long serialVersionUID = -8343571607928543872L;

	@ManagedProperty(value="#{repuestoService}")
	private RepuestoService repuestoService;
	@ManagedProperty(value="#{unidadMedidaService}")
	private UnidadMedidaService unidadMedidaService;
	
	private RepuestoForm 	repuestoForm;
	private Repuesto 		repuestoNuevo;
	private Repuesto 		repuestoEditar;
	private RepuestoAdapter repuestoEliminar;
	
	private List<Repuesto> 					listaRepuesto;
	private LazyDataModel<RepuestoAdapter> 	listaRepuestoLazy;
	private List<UnidadMedida> 				listaUnidadMedida;
	
	public GestionRepuestosController () {
		logger.info("GestionRepuestosController");
		
		repuestoForm			= new RepuestoForm();
		repuestoNuevo     		= new Repuesto();
		repuestoEditar    		= new Repuesto();

		listaRepuesto	  		= new ArrayList<Repuesto>(0);
		listaUnidadMedida 		= new ArrayList<UnidadMedida>(0);
	}
	
	@PostConstruct
	public void init() {
		logger.info("init");
		listarUnidadesDeMedida();
		buscarRepuestos();
	}
	
	private void listarUnidadesDeMedida() {
		try {
			listaUnidadMedida = unidadMedidaService.listarUnidadMedidasActivos();
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarUnidadesDeMedida DivemotorBusinessException: " + e.getMessage());
			FacesContextUtil.warn(e.getMessage());
		} catch (Exception e) {
			logger.error("EX* listarUnidadesDeMedida Exception: " + e.getMessage());
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}
	
	public void buscarRepuestos() {
		listaRepuestoLazy = new RepuestosLazy(repuestoService, repuestoForm);
	}
	
	public void seleccionarEdicionRepuesto(RepuestoAdapter repuesto){
		try {
			repuestoEditar = repuestoService.obtenerRepuestoPorId(repuesto.getIdRepuesto());
			repuestoEditar.setIdUnidad();
		} catch (DivemotorBusinessException e) {
			logger.error("EX* clickRepuesto: " + e.getMessage());
		}
	}
	
	public void limpiarBusqueda(){
		repuestoForm.limpiarForm();
	}
	
	public void guardarNuevoRepuesto() {
		
		try {
			repuestoNuevo.setUnidadMedida(new UnidadMedida(repuestoNuevo.getIdUnidad()));
			repuestoService.insertarRepuesto(repuestoNuevo);
			buscarRepuestos();
			FacesContextUtil.info(Constantes.MSJ_REPUESTO_REGISTRO_OK);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* guardarNuevoRepuesto DivemotorBusinessException: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.warn(e.getMessage());
		}catch (Exception e) {
			logger.error("EX* guardarNuevoRepuesto Exception: " + e.getMessage());
			RequestContext.getCurrentInstance().addCallbackParam("ocurrioError", true);
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}
	
	public void actualizarRepuesto() {
		try {
			repuestoEditar.setUnidadMedida(new UnidadMedida(repuestoEditar.getIdUnidad()));
			repuestoService.actualizarRepuesto(repuestoEditar);
			buscarRepuestos();
			FacesContextUtil.info(Constantes.MSJ_REPUESTO_ACTUALIZADO_OK);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* actualizarRepuesto DivemotorBusinessException: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.warn(e.getMessage());
		} catch (Exception e) {
			logger.error("EX* actualizarRepuesto Exception: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}
	
	public void eliminarRepuesto() {
		try {
			Repuesto repuesto = repuestoService.obtenerRepuestoPorId(repuestoEliminar.getIdRepuesto());
			repuestoService.eliminarRepuesto(repuesto);
			buscarRepuestos();
			FacesContextUtil.info(Constantes.MSJ_REPUESTO_ELIMINADO_OK);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* eliminarRepuesto DivemotorBusinessException: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.warn(e.getMessage());
		} catch (Exception e) {
			logger.error("EX* eliminarRepuesto Exception: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}
	
	public void limpiarNuevoRepuesto(){
		repuestoNuevo = new Repuesto();
	}

	public void setRepuestoService(RepuestoService repuestoService) {
		this.repuestoService = repuestoService;
	}

	public Repuesto getRepuestoNuevo() {
		return repuestoNuevo;
	}

	public void setRepuestoNuevo(Repuesto repuestoNuevo) {
		this.repuestoNuevo = repuestoNuevo;
	}

	public Repuesto getRepuestoEditar() {
		return repuestoEditar;
	}

	public void setRepuestoEditar(Repuesto repuestoEditar) {
		this.repuestoEditar = repuestoEditar;
	}

	public RepuestoAdapter getRepuestoEliminar() {
		return repuestoEliminar;
	}

	public void setRepuestoEliminar(RepuestoAdapter repuestoEliminar) {
		this.repuestoEliminar = repuestoEliminar;
	}

	public List<Repuesto> getListaRepuesto() {
		return listaRepuesto;
	}

	public void setListaRepuesto(List<Repuesto> listaRepuesto) {
		this.listaRepuesto = listaRepuesto;
	}

	public LazyDataModel<RepuestoAdapter> getListaRepuestoLazy() {
		return listaRepuestoLazy;
	}

	public void setListaRepuestoLazy(LazyDataModel<RepuestoAdapter> listaRepuestoLazy) {
		this.listaRepuestoLazy = listaRepuestoLazy;
	}

	public List<UnidadMedida> getListaUnidadMedida() {
		return listaUnidadMedida;
	}

	public void setListaUnidadMedida(List<UnidadMedida> listaUnidadMedida) {
		this.listaUnidadMedida = listaUnidadMedida;
	}

	public void setUnidadMedidaService(UnidadMedidaService unidadMedidaService) {
		this.unidadMedidaService = unidadMedidaService;
	}

	public RepuestoForm getRepuestoForm() {
		return repuestoForm;
	}

	public void setRepuestoForm(RepuestoForm repuestoForm) {
		this.repuestoForm = repuestoForm;
	}
}
